package com.operator.Activitys.activity;

import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.EditText;

import com.google.gson.Gson;
import com.operator.Activitys.R;
import com.operator.Activitys.activity.base.BaseActivity;
import com.operator.Activitys.bean.User;
import com.operator.Activitys.bean.pack.UserJsonPack;
import com.operator.Activitys.http.manager.UserManager;
import com.operator.Activitys.jpush.ExampleUtil;
import com.operator.Activitys.utils.CheckUtils;
import com.operator.Activitys.utils.Constant;
import com.operator.Activitys.utils.JumperUtils;
import com.operator.Activitys.utils.ToastUtils;

import org.simple.eventbus.Subscriber;

import java.util.Set;

import butterknife.Bind;
import butterknife.OnClick;
import cn.jpush.android.api.JPushInterface;
import cn.jpush.android.api.TagAliasCallback;

/**
 * 项目名称：金泽云 手机app
 * 类描述：登录页面
 * 创建人：张飞祥
 * 创建时间：2018/5/2 14:20
 * 修改人：张飞祥
 * 修改时间：2018/5/2 14:20
 * 修改备注：
 */
public class LoginActivity extends BaseActivity {

    //账号
    @Bind(R.id.et_login_name)
    EditText etLoginName;
    //密码
    @Bind(R.id.et_login_pwd)
    EditText etLoginPwd;


    //初始化网络请求
    public UserManager mApiManager;
    //TODO 获取保存 的 用户名密码
    //用户名
    private String mACacheLoginName = null;
    //密码
    private String mACacheLoginPwd = null;

    @Override
    protected void initUI() {
        setContentView(R.layout.act_login);
        //网络请求接口 常驻方法
        mApiManager = mApiManager.getUserApiManager(this, this.getTaskId());
    }

    @Override
    protected void initData() {
        //TODO 获取用户名
        mACacheLoginName = mACache.getAsString(Constant.CACHE_LOGIN_NAME);
        //TODO 获取密码
        mACacheLoginPwd = mACache.getAsString(Constant.CACHE_LOGIN_PWD);

        //设置用户名
        if (mACacheLoginName!=null){
            etLoginName.setText(mACacheLoginName);
        }

        //设置密码
        if (mACacheLoginPwd!=null){
            etLoginPwd.setText(mACacheLoginPwd);
        }
    }


    /**
     * 按钮点击事件
     * @return
     */
    @OnClick({R.id.tv_login_forget_pwd,R.id.tv_login_register,R.id.btn_login})
    public void onClick(View view){
        switch (view.getId()){
            case R.id.tv_login_forget_pwd:    //忘记密码
                JumperUtils.JumpTo(this,PwdUsedActivity.class);
                break;
            case R.id.tv_login_register:      //我要注册
                JumperUtils.JumpTo(this,RegisterActivity.class);
                break;
            case R.id.btn_login:              //登录
                setLogin();
                break;
        }
    }

    /**
     * 登录
     */
    private void setLogin() {

        //获取用户名
        String loginName = etLoginName.getText().toString();
        //获取密码
        String loginPwd = etLoginPwd.getText().toString();

        /**
         * 1.判断每个字段非空
         * 2.判断手机号码格式
         */
        if (loginName.equals("") || loginPwd.equals("")) {
            ToastUtils.showShort(this, "请您认真填写，全部内容不许为空！");
        } else if (!CheckUtils.isMobile(loginName)) {
            ToastUtils.showShort(this, "手机号码格式不正确！");
        }else{
            //显示加载窗
            initShowTimeDialog("正在登录，请稍候...",this);
            //开始登录网络请求
            mApiManager.userLogin(loginName,loginPwd);
        }
    }

    /**
     * 响应 登录请求 出错
     */
    @Subscriber(tag = Constant.BUS_LOGIN_ERROR)
    public void onLoginError(String strError) {
        //延时 1s
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //销毁弹窗
                timeDialog.dismiss();
                //弹出提示
                ToastUtils.showShort(LoginActivity.this, "网络连接不稳定，请重试！");
            }
        },1000);
    }

    /**
     * 加载 登录请求 返回结果
     */
    @Subscriber(tag = Constant.BUS_LOGIN)
    public void onLogin(final UserJsonPack pack) {
        //延时 1s
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //销毁弹窗
                timeDialog.dismiss();
                //获取 当前 user
                User user = pack.getData();
                //业务逻辑判断
                if (pack.getState().equals("1")){
                    if (user!=null){

                        //获取用户名
                        String loginName = etLoginName.getText().toString();
                        //获取密码
                        String loginPwd = etLoginPwd.getText().toString();

                        //TODO 保存当前 用户名 密码
                        //用户名
                        mACache.put(Constant.CACHE_LOGIN_NAME,loginName);
                        //密码
                        mACache.put(Constant.CACHE_LOGIN_PWD,loginPwd);
                        //提现提示信息
                        mACache.put(Constant.CACHE_LOGIN_PUT_FORWARD_MSG,pack.getPrompt());
                        //电话订单提示信息
                        mACache.put(Constant.CACHE_LOGIN_PHONE_ORDER_MSG,pack.getTelOrderCue());
                        //宽带订单提示信息
                        mACache.put(Constant.CACHE_LOGIN_INSTALL_ORDER_MSG,pack.getBroadbandOrderCue());
                        //设置 极光推送 别名
                        initPushAlias(user.getId()+"");
                        //TODO 将当前用户实体存储在 本地
                        mACache.put(Constant.CACHE_USER, new Gson().toJson(user));
                        // 登录提示
                        ToastUtils.showShort(LoginActivity.this, "登录成功");
                        // 登录成功跳转到主页面
                        JumperUtils.JumpTo(LoginActivity.this, MainActivity.class);
                        //销毁当前页面
                        finish();
                    }
                }else{
                    // 登录失败提示
                    ToastUtils.showShort(LoginActivity.this, pack.getMsg());
                }
            }
        },1000);
    }

    /**
     * 极光推送（设置别名）
     */
    private void initPushAlias(String aliasName) {
        /**
         * 这行代码即实现了设置别名和标签。由于别名和标签都是用于给
         * JPush服务器区分用户的，不一定非要同时设置别名和标签。也就是说
         * 只设置了别名也是可以的。并且也不要求别名和标签的唯一性。
         * 开发者可以根据自己的需要进行设置。
         * 例如 我只设置别名，并且别名是唯一的，只用给jpush服务器给哪些别名发送推送就可以了。
         * 或者说设置了别名并且唯一，但是根据标签进行了分组，同一个标签下面包含了多个别名，按照标签就可以实现群发功能了。
         */
        JPushInterface.setAliasAndTags(LoginActivity.this, aliasName, null, mAliasCallback);
    }


    /**

     **/
    /**
     * 极光推送 回调监听
     * <p>
     * TagAliasCallback类是JPush开发包jar中的类，用于
     * 设置别名和标签的回调接口，成功与否都会回调该方法
     * 同时给定回调的代码。如果code=0,说明别名设置成功。
     * <p>
     * 6001   无效的设置，tag/alias 不应参数都为 null
     * 6002   设置超时    建议重试
     * 6003   alias 字符串不合法    有效的别名、标签组成：字母（区分大小写）、数字、下划线、汉字。
     * 6004   alias超长。最多 40个字节    中文 UTF-8 是 3 个字节
     * 6005   某一个 tag 字符串不合法  有效的别名、标签组成：字母（区分大小写）、数字、下划线、汉字。
     * 6006   某一个 tag 超长。一个 tag 最多 40个字节  中文 UTF-8 是 3 个字节
     * 6007   tags 数量超出限制。最多 100个 这是一台设备的限制。一个应用全局的标签数量无限制。
     * 6008   tag/alias 超出总长度限制。总长度最多 1K 字节
     * 6011   10s内设置tag或alias大于3次 短时间内操作过于频繁
     **/
    private final TagAliasCallback mAliasCallback = new TagAliasCallback() {
        @Override
        public void gotResult(int code, String alias, Set<String> tags) {
            String logs;
            switch (code) {
                case 0:
                    logs = "Set tag and alias success";
                    Log.i("JPush", logs);
                    break;
                case 6002:
                    logs = "Failed to set alias and tags due to timeout. Try again after 60s.";
                    Log.i("JPush", logs);
//                    if (ExampleUtil.isConnected(getApplicationContext())) {
//                        mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_SET_ALIAS, alias), 1000 * 60);
//                    } else {
//                        Log.i(TAG, "No network");
//                    }
                    break;
                default:
                    logs = "Failed with errorCode = " + code;
                    Log.e("JPush", logs);
            }
            ExampleUtil.showToast(logs, LoginActivity.this);
        }
    };

}
